/**
 *	@file	pgmap_sys.h
 *	@brief	ポケギアマップ　システムヘッダ
 *	@author	Miyuki Iwasawa
 *	@date	07.06.20
 */

#ifndef __H_PGMAP_SYS_H__
#define __H_PGMAP_SYS_H__

#include "system/wordset.h"
#include "system/fontoam.h"
#include "system/selbox.h"
#include "tel/pmtel_book.h"
#include "tel/pmtel_datman.h"
#include "field/move_pokemon.h"
#include "field/move_pokemon_def.h"
#include "msgdata/msg_pgmap_guide.h"
#include "town_param.h"
#include "mzone_param.h"
#include "pgmap_def.h"

typedef enum{
 MAP_MODE_PG,
 MAP_MODE_JUMP,
 MAP_MODE_BG,
};

typedef enum{
 WIN_G01,
 WIN_G02,
 WIN_G03,
 WIN_MK01,
 WIN_MK02,
 WIN_MK03,
 WIN_MK04,
 WIN_ME01,
 WIN_EXP01 = WIN_ME01,
 WIN_ME02,
 WIN_EXP02 = WIN_ME02,
 WIN_MAX,
}WIN_NAME;

#define WORDSET_PGMAP_BUFLEN	(18*2*2+EOM_SIZE)	//18文字*2行*2

typedef struct{
	s16 x,z;
}_BLOCK;

typedef union{
	struct{
	s16	x;
	s16	z;
	u16 zone;
	u16	val;
	};
	u16	buf[4];
}_PLAYER_ZONE;

//マーカーリスト管理構造体
typedef struct{
	MARKER_DATA_WK	mark;	///マーカーテンポラリ構造体

	u8	myid;
	u8	prev;
	u8	next;
	u8	valid;
}MARKER_LIST;

//ターゲットゾーンデータポイント構造体
typedef struct{
	MAP_ZONE_PARAM* z_prm;
	MARKER_LIST*	mk_prm;
	u16	tx,tz;	//現在座標
}TARGET_ZONE;

//スクロール管理構造体
typedef struct{
	int	x;
	int	y;
	int	ax;
	int	ay;
	int	cx;
	int	cy;

	fx32	dx,dy;	//スクロール移動差分
	fx32	px,py;	//スクロール移動差分

	u16	b_u,b_d,b_l,b_r;	///<今見えてるブロック範囲

	_POSITION	bg_d;
	_POSITION	bg_end;
}_SCROLL;

typedef struct{
	u16	lim_bl;			//スクロールリミット設定block left
	u16	lim_br;			//スクロールリミット設定block right
	u16	lim_bu;			//スクロールリミット設定block up
	u16	lim_bd;			//スクロールリミット設定block down
}_SCROLL_PARAM;

typedef struct _PGMAP_MSG{
	MSGDATA_MANAGER *gMan;

	WORDSET* wset;		///<ワーク
	STRBUF	*tmp;		///<汎用
	STRBUF	*endbuf;	///<やめる
	STRBUF	*listbuf;	///<やめる
	STRBUF	*area[2];	///<ジョウト/カントー
	STRBUF	*place;		//地名
	STRBUF	*exp[3];	///<各種説明文
	STRBUF	*pms_word;	///<簡易会話ワード
	u8	msg_spd;	///<メッセージスピード
	u8	dmy[3];	///<padding
}PGMAP_MSG;

typedef struct _PGMAP_FONTOAM{
	FONTOAM_OBJ_PTR foam;
	CHAR_MANAGER_ALLOCDATA cma;
}PGMAP_FONTOAM;

///ポケギアマップ　ワーク構造体
typedef struct{
	int heapID;	///<heapID
	int	main_seq;	///<main seq id
	int	sub_seq;	///<sub seq id
	u8	call_mode;	///<呼び出しモード
	u8	map_mode;	///<マップ呼び出しモード
	u8	my_local;	///<自分がいる地方
	s8	jump_target;	///<空を飛ぶのターゲットインデックス

	PGEAR_SYS_WORK* sys;	///<システムワークへのポインタ
	PGSYS_RET_PRM_MAP ret;	///<引継ぎパラメータ

	/////////////////////////////////////////////////////////
	int	sub_scr_end;
	int	sub_ct;

	FMZ_PTR	pZone;		///<ゾーンデータ取得ポインタ

	FONTOAM_SYS_PTR		pFOamSys;	///<FontOamマネージャ
	FONTOAM_OAM_DATA_PTR pFOamData;	///<FontOam Oamデータ
	PGMAP_FONTOAM		pFontOam[MEDIT_PLATE_MAX];
	PGEAR_ACTWORK_MAN	*pActWMan;	///<アクターワークマネージャ
	PGMAP_MSG			msgDat;	///<メッセージデータ

	///選択ボックスリスト
	SELBOX_SYS*		sbox;		///<選択ボックスシステムワーク
	BMPLIST_DATA*	plist;		///<選択ボックスリスト
	SELBOX_WORK*	list_wk;	///<選択ボックスワーク

	_SCROLL			cScrl;
	_SCROLL_PARAM	scrl;	///<スクロールパラメータ設定

	_PLAYER_ZONE	player;		///<主人公の位置
	_BLOCK			cTarget;		///<カレント選択ターゲットのブロック位置
//	_BLOCK			player_org;		///<主人公の位置(フィールド上の正位置)

	_POSITION		o_cursor;	///<旧カーソル座標

	TARGET_ZONE	cZone;	///<ターゲットゾーン
	PMTEL_SAVE*	tel_sv;	///<電話セーブデータ
	PMTEL_BOOK_MAN* tel_book;	///<電話帳データ
	PMTEL_NUMBER*	tel_number;	///<電話帳登録ナンバー配列
	u8	tel_nummax;	///<電話帳登録数

	u8	mapf_usiz;	///<マップフィールドUオフセット
	u8	mapf_lsiz;	///<マップフィールドLオフセット
	s8	maps_hdef;	///<H方向オフセット
	s8	maps_wdef;	///<W方向オフセット

	u8	palEvy;		///<パレットフェードコントロール値
	u8	zTblMax;	///<ゾーンテーブルパラメータの数
	u8	markerNum;

	u8	f_affine:1;		///<アフィンモードフラグ
	u8	keymode_st:3;	///<キー入力モードステータス
	u8	keymode:1;		///<キー入力モード
	u8	f_open:2;		///<オープンモード
	u8	f_scrl_up:1;	///<スクロールアップデート

	u8	input_st:1;		///<キーステート
	u8	aff_st:1;		///<キーステート
	u8	cmove_st:1;		///<キーステート
	u8	touch_st:1;		///<タッチのステータス
	u8	touch_pos:4;	///<タッチしたポジションNo
	u8	key_move;	///<キーステート
	u8	key_dir;	///<キー方向

	u8	mkedit_st:7;	///<マーク編集画面操作の状態
	u8	mkedit_view:1;	///<マーク編集画面操作の状態

	u8	arrive_t24:1;
	u8	arrive_safari:1;
	u8	arrive_shinto:1;
	u8	arrive_ship:1;
	u8	arrive_dmy:4;

	s16	tp_ofsx;	///<タッチパネルのオフセット
	s16	tp_ofsy;
	s16	tp_ox;
	s16	tp_oy;
	s16	tp_sx,tp_sy;
	s16	tp_lu,tp_ld,tp_ll,tp_lr;

	//BTS4359 前回ZoneIdの退避
	u16	before_zone_id;

	///グラフィックリソース
	void*	pSBufGuide;
	void*	pSBufMap;
	void*	pSBufGMap;
	void*	pSBufFrm;
	void*	pSBufMk0;
	void*	pSBufMk1;
	NNSG2dScreenData*	pSGuide;
	NNSG2dScreenData*	pSMap;
	NNSG2dScreenData*	pSGMap;
	NNSG2dScreenData*	pSFrm;
	NNSG2dScreenData*	pSMk0;
	NNSG2dScreenData*	pSMk1;
	GF_BGL_BMPWIN	win[WIN_MAX];

	///マーカーリストデータ
	const MAP_ZONE_PARAM*	pMZoneTbl;	///<マーカー登録データへのポインタ
	MARKER_LIST	mk_list[MARKER_STOCK_MAX];

	//移動ポケモン有効データチェック
	u16			mv_poke_zone[MOVE_POKE_MAX];	//0なら無効
	u8			mk_sid;	///<マーカーリストのスタートid
	u8			mk_eid;	///<マーカーリストのエンドid
	u8			mk_initNum;	///<マーカーの初期登録数

#ifdef PM_DEBUG
	u8	debug_f;	///<デバッグフラグ
#endif	//PM_DEBUG

}PGMAP_SYS_WORK;

///呼び出しモード定義
typedef enum{
 PGMAP_CALL_MAP,
 PGMAP_CALL_MARK,
};

///シーケンス定義
typedef enum{
 PGMAP_SEQ_INIT,
 PGMAP_SEQ_MAIN,
 PGMAP_SEQ_END,
 PGMAP_SEQ_SBTN_EFFWAIT,
 PGMAP_SEQ_ALL_FADEIN,
 PGMAP_SEQ_ALL_FADEOUT,
 PGMAP_SEQ_VIEW_FADEIN,
 PGMAP_SEQ_VIEW_FADEOUT,
 PGMAP_SEQ_MARK_INIT,
 PGMAP_SEQ_MARK_MAIN,
 PGMAP_SEQ_MARK_END_MAP,
 PGMAP_SEQ_MARK_END_WORD,
 PGMAP_SEQ_JUMP_SELECT,
 PGMAP_SEQ_APP_EXIT,

}PGMAP_SEQ_DEF;

#include "pgmap_gra.naix"

#define PGMAP_MATOFS_Z	(2)

///キー動作方行定義
typedef enum{
 KEYDIR_U,
 KEYDIR_D,
 KEYDIR_L,
 KEYDIR_R,
 KEYDIR_FU = 0x0001,
 KEYDIR_FD = 0x0002,
 KEYDIR_FL = 0x0004,
 KEYDIR_FR = 0x0008,
}KEY_DIR;

///アクター定義値
enum{
 NACT_START = 0,
 NACT_MARK1 = NACT_START,
 NACT_MARK2,
 NACT_MARK3,
 NACT_MARK4,
 NACT_REV,
 NACT_CURSOR,
 NACT_HERO,
 NACT_POKE1,
 NACT_POKE2,
 NACT_POKE3,
 NACT_POKE4,
 NACT_NUM,
 NACT_MAX=NACT_NUM,
};

//マーキング
#define MKACT_START		(NACT_MAX)
#define MKACT_NUM		(MARKER_STOCK_MAX)
#define MKACT_MAX		(MKACT_START+MKACT_NUM)

#define PGMAP_ACTMAX	(MKACT_MAX)

//空を飛ぶ
#define SACT_START	(NACT_MAX)
#define SACT_CLU	(SACT_START)
#define SACT_CLD	(SACT_CLU+1)
#define SACT_CRU	(SACT_CLD+1)
#define SACT_CRD	(SACT_CRU+1)
#define SACT_ICON	(SACT_CRD+1)
#define SACT_NUM	(PGMAP_TOWN_MAX)
#define SACT_MAX	(SACT_ICON+SACT_NUM)
#define PGSKY_ACTMAX	(SACT_MAX)

//メモ
enum{
 EACT_START = NACT_MAX,
 EACT_ARROW = EACT_START,
 EACT_CLT1,
 EACT_CLB1,
 EACT_CRT1,
 EACT_CRB1,
 EACT_CLT2,
 EACT_CLB2,
 EACT_CRT2,
 EACT_CRB2,
 EACT_MARK1,
 EACT_MARK2,
 EACT_MARK3,
 EACT_MARK4,
 EACT_PLATE1,
 EACT_PLATE2,
 EACT_PLATE3,
 EACT_PLATE4,
 EACT_MKDEF1,
 EACT_MKDEF2,
 EACT_MKDEF3,
 EACT_MKDEF4,
 EACT_MKDEF5,
 EACT_MKDEF6,
 EACT_MKDEF7,
 EACT_MKDEF8,
 EACT_MAX,
 EACT_NUM = (EACT_MAX-EACT_START),
};

///アクターリソース定義
typedef enum{
 RESACT_MARK,
 RESACT_HERO,
 RESACT_MEMO,
};

typedef enum{
 ANM_H_CURSOR,
 ANM_H_HERO,
 ANM_H_POKE,
 ANM_H_ARROW,
 ANM_H_MARK,
 ANM_H_MKCUR_LT,
 ANM_H_MKCUR_LB,
 ANM_H_MKCUR_RT,
 ANM_H_MKCUR_RB,
 ANM_H_SKY01,
 ANM_H_SKY02,
 ANM_H_SKY03,
};

typedef enum{
 ANM_MK_ICON,
 ANM_MK_REVENGE,
};
typedef enum{
 ANM_MM_PLATE,
};

///マーキング編集画面操作モード
typedef enum{
 MKEDIT_SEL,
 MKEDIT_MSEL,
 MKEDIT_DEL,
};

#endif	//__H_PGMAP_SYS_H__
